/**************************************************************************
 * @name: sched_fifo.c
 * @brief: 学习线程的属性设置，多线程的先到先服务
 * @date: 2025/02/15
 * @author: boluzs@163.com
 * @note: None
 * @version: 1.0.0
 * @Copyright (c) 2025 by boluzs@163.com, All Rights Reserved.
 **************************************************************************/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <stdlib.h>

#include <time.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>

#define BUF_SIZE 10

char buf[BUF_SIZE] = {0};

// 构造线程的回调函数 格式是固定的
void *threadA_handler(void *arg)
{
    for (;;)
    {
        printf("threadA is running\n");
        sleep(1);
    }
}

// 构造线程的回调函数 格式是固定的
void *threadB_handler(void *arg)
{
    for (;;)
    {
        printf("threadB is running\n");
        sleep(1);
    }
}

int main()
{

    pthread_t newthreadA_id = 0; // 用于记录创建的新线程的ID，可以理解为是线程的句柄
    pthread_t newthreadB_id = 0; // 用于记录创建的新线程的ID，可以理解为是线程的句柄

    // 1.定义属性对象并初始化
    pthread_attr_t attr;
    pthread_attr_init(&attr);

    // 2.修改线程属性对象中的继承调度属性为“不继承”
    pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);

    // 3.设置线程属性对象的调度策略，比如先到先服务
    pthread_attr_setschedpolicy(&attr, SCHED_FIFO);

    // 4.修改线程属性中的静态优先级，实时任务必须使用实时调度策略
    struct sched_param param;
    param.sched_priority = 10;
    pthread_attr_setschedparam(&attr, &param);

    // 5.创建新线程
    pthread_create(&newthreadA_id, &attr, threadA_handler, NULL);
    pthread_create(&newthreadB_id, &attr, threadB_handler, NULL);

    // 6.
    pthread_join(newthreadA_id, NULL);
    pthread_join(newthreadB_id, NULL);

    // 主线程的任务
    for (;;)
    {
    }
    return 0;
}
